// Interface data format used to return a unified format
import { ResultEnum } from '/@/enums/httpEnum';

/**
 * 返回成功的结果对象。
 * @template T - 结果对象的类型，默认为 Recordable。
 * @param {T} result - 结果对象。
 * @param {{ message?: string }} options - 可选参数，包括消息字符串。
 * @returns {object} - 包含成功信息的结果对象。
 */
export function resultSuccess<T = Recordable>(result: T, { message = 'ok' } = {}) {
  return {
    code: ResultEnum.SUCCESS,
    result,
    message,
    type: 'success',
  };
}

/**
 * 返回分页成功的结果对象。
 * @template T - 列表项的类型，默认为 any。
 * @param {number} page - 当前页码。
 * @param {number} pageSize - 每页显示的数量。
 * @param {T[]} list - 列表数组。
 * @param {{ message?: string }} options - 可选参数，包括消息字符串。
 * @returns {object} - 包含分页成功信息以及分页数据的结果对象。
 */
export function resultPageSuccess<T = any>(
  page: number,
  pageSize: number,
  list: T[],
  { message = 'ok' } = {},
) {
  const pageData = pagination(page, pageSize, list);

  return {
    ...resultSuccess({
      items: pageData,
      total: list.length,
    }),
    message,
  };
}

/**
 * 返回错误的结果对象。
 * @param {string} message - 错误消息字符串，默认为 'Request failed'。
 * @param {{ code?: number, result?: any}} options - 可选参数，包括错误代码和结果对象。
 * @returns {object} - 包含错误信息的结果对象。
 */
export function resultError(
  message = 'Request failed',
  { code = ResultEnum.ERROR, result = null } = {},
) {
  return {
    code,
    result,
    message,
    type: 'error',
  };
}

/**
 * 分页函数，用于根据页码和每页大小对数组进行分页。
 * @param {number} pageNo - 当前页码，从1开始计数。
 * @param {number} pageSize - 每页大小。
 * @param {T[]} array - 要分页的数组。
 * @returns {T[]} - 分页后的数组。
 * @template T
 */
export function pagination<T = any>(pageNo: number, pageSize: number, array: T[]): T[] {
  // 计算当前页的起始偏移量
  const offset = (pageNo - 1) * Number(pageSize);

  // 根据偏移量和每页大小切割数组，返回分页结果
  return offset + Number(pageSize) >= array.length
    ? array.slice(offset, array.length)
    : array.slice(offset, offset + Number(pageSize));
}

/**
 * 请求参数接口。
 */
export interface requestParams {
  /**
   * 请求方法。
   * @type {string}
   */
  method: string;

  /**
   * 请求体数据。
   * @type {any}
   */
  body: any;

  /**
   * 请求头部信息。
   * @type {{ authorization?: string }}
   */
  headers?: { authorization?: string };

  /**
   * 请求查询字符串参数。
   * @type {any}
   */
  query: any;
}

/**
 * 获取请求中的令牌。
 * @param {requestParams} params - 请求参数对象。
 * @returns {string | undefined} - 请求中的令牌，如果未指定则返回 undefined。
 */
export function getRequestToken({ headers }: requestParams): string | undefined {
  // 返回请求头部中的 authorization 字段作为令牌。
  return headers?.authorization;
}
